 ;-----------------------------\
 ;escape 4k demo                 \
 ;made for code craft contest      \
 ;code - tom/kulture 1999            \
 ;------------------------------------ \

 ;Interrupt code setup------------------------------------------------------|
 ;make sure the angles/coordinates are updated every 100hz even if the screen
 ;isnt, so that it runs at the same 'speed' on any machine but with less/more
 ;fps

 ;Claim tickerV
 mov r0,#&1C
 adr r1,ticker
 mov r2,#007 ;the names bond, james bond =)
 swi OS_Claim

 ;Triple buffering code..
 mov r0,#&10
 adr r1,vbl
 mov r2,#007
 swi OS_Claim
 ;ensure event is enabled
 mov r0,#&e
 mov r1,#4
 swi OS_Byte

 b int_end

 ;When we quit the demo it must be released or it will go very wrong...
.int_off
 mov r0,#&1C
 adr r1,ticker
 mov r2,#007
 swi OS_Release

 mov r0,#&10
 adr r1,vbl
 mov r2,#007
 swi OS_Release
 ;Switch off event
 mov r0,#&d
 mov r1,#4
 swi OS_Byte

 mov r0,#&1C
 adr r1,true_playa
 mov r2,#007
 swi OS_Release

 adr r5,sound_c
 ldmia r5,{r0-r4}
 swi Sound_Configure

 ;Set stereo positions..
 mov r0,#4
 adr r12,stereo_pos
.stereo_u
 ldr r1,[r12],#4
 swi Sound_Stereo
 subs r0,r0,#1
 bne stereo_u

 ;memory..
 mov r0,#7
 ldr r2,samples
 swi OS_Module

 ;reset screen blanker..
 mov r0,#3
 ldr r1,ScrBlank
 swi XScreenBlanker_Control

 adr r0,del_on
 swi XOS_CLI

 ;well now is as good a time as any to quit
 mov r0,#200
 adr r2,task
 swi Wimp_Initialise
 mov r0,#21
 mov r1,#0
 swi OS_Byte
 mov r1,#9
 swi OS_Byte
 mov r0,#124
 swi OS_Byte

 swi OS_Exit

.task
 dcb "TASK",0
 align
.del_on
 dcb "Delirium_Enable",0
 align

.ticker
 stmfd r13!,{r0-r12,r14}

 ;Update the counter...
 ldr r0,counter
 add r0,r0,#1
 str r0,counter

 ;Set correct demo effect
 adr r1,tunnel
 str r1,effect

 cmp r0,#2048
 adrgt r1,planes
 strgt r1,effect

 cmp r0,#4096
 adrgt r1,cube
 strgt r1,effect

 cmp r0,#4096+2048
 adrgt r1,int_off
 strgt r1,effect

 ;Update tunnel if neccessary
 ldr r1,radius_circle
 str r1,radius

 cmp r0,#1024
 ldrgt r1,radius_flower
 strgt r1,radius

 cmp r0,#1024+512
 ldrgt r1,radius_triangle
 strgt r1,radius

 ;Update angles
 adr r0,xangle
 ldmia r0,{r1-r3}
 add r1,r1,#1
 add r2,r2,#1
 add r3,r3,#1
 and r1,r1,#1023
 and r2,r2,#1023
 and r3,r3,#1023
 stmia r0,{r1-r3}

 ldr r0,z
 add r0,r0,#1
 and r0,r0,#127
 str r0,z

 adr r0,lc
 ldmia r0,{r1,r2}
 sub r2,r2,#512
 sub r1,r1,#512
 add r1,r1,r2,asr #6
 sub r2,r2,r1,asr #6
 add r1,r1,#512
 add r2,r2,#512
 stmia r0,{r1,r2}

 ldmfd r13!,{r0-r12,pc}^

.counter
  dcd 0



.vbl
 cmp r0,#4
 movnes pc,r14
 stmfd r13!,{r0-r1,r14}
 adr r12,work
 ldmia r12,{r0-r1}
 subs r1,r1,#1
 moveq r1,#3
 ;check if work has finished
 cmp r0,r1
 ldmeqfd r13!,{r0-r1,pc}^
 ;if so jump down a screen bank
 str r1,[r12,#4]
 ;now set banks..
 ;must switch to supervisor mode..
 mov r12,pc
 orr r0,r12,#3
 teqp r0,#0
 mov r0,r0
 stmfd r13!,{r14}
 mov r0,#113
 swi OS_Byte
 ldmfd r13!,{r14}
 teqp r12,#0
 mov r0,r0

 ;done
 ldmfd r13!,{r0-r1,pc}^




.video
 dcd 0
.work
 dcd 2
.show
 dcd 3


